React Query 教程
1. 简介
React Query 是一个强大的库,用于在 React 应用程序中管理和缓存服务器状态。它简化了数据获取、缓存、同步和更新服务器状态的过程。React Query 的核心功能包括数据获取、缓存、分页、无限滚动、错误处理等。
2. 安装和环境搭建
首先,确保你已经安装了 Node.js 和 npm。然后,使用 Create React App 创建一个新的 React 项目。
npx create-react-app react-query-demo
cd react-query-demo
接下来,安装 React Query 和 Axios(用于数据获取)。
npm install @tanstack/react-query axios
3. 配置 React Query
在你的 React 应用程序中,你需要配置 React Query 的客户端。通常在 index.js 或 App.js 中进行配置。
import React from 'react';
import ReactDOM from 'react-dom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import App from './App';
const queryClient = new QueryClient();
ReactDOM.render(
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>,
document.getElementById('root')
);
4. 基本使用
4.1 数据获取
使用 useQuery 钩子来获取数据。useQuery 接受一个唯一的键(key)和一个返回 Promise 的函数。
import React from 'react';
import axios from 'axios';
import { useQuery } from '@tanstack/react-query';
function Posts() {
const { data, error, isLoading } = useQuery(['posts'], () =>
axios.get('https://jsonplaceholder.typicode.com/posts').then(res => res.data)
);
if (isLoading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return (
<ul>
{data.map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
);
}
export default Posts;
4.2 数据缓存
React Query 会自动缓存数据。当再次请求相同的数据时,React Query 会从缓存中返回数据,而不是重新请求服务器。
4.3 错误处理
在 useQuery 中,你可以通过 error 对象来处理错误。
if (error) return <div>Error: {error.message}</div>;
4.4 分页和无限滚动
React Query 支持分页和无限滚动。你可以使用 useInfiniteQuery 钩子来实现无限滚动。
import React from 'react';
import axios from 'axios';
import { useInfiniteQuery } from '@tanstack/react-query';
function InfinitePosts() {
const { data, fetchNextPage, hasNextPage, isFetchingNextPage } = useInfiniteQuery(
['posts'],
({ pageParam = 1 }) =>
axios.get(`https://jsonplaceholder.typicode.com/posts?_page=${pageParam}&_limit=10`).then(res => res.data),
{
getNextPageParam: (lastPage, allPages) => {
const nextPage = allPages.length + 1;
return nextPage;
},
}
);
return (
<div>
{data?.pages.map((page, i) => (
<React.Fragment key={i}>
{page.map(post => (
<div key={post.id}>{post.title}</div>
))}
</React.Fragment>
))}
<button onClick={() => fetchNextPage()} disabled={!hasNextPage || isFetchingNextPage}>
{isFetchingNextPage ? 'Loading more...' : hasNextPage ? 'Load More' : 'Nothing more to load'}
</button>
</div>
);
}
export default InfinitePosts;
5. 实践练习
5.1 练习:创建一个简单的博客应用
- 使用 React Query 获取博客文章数据。
- 实现分页功能,每次加载 10 篇文章。
- 添加错误处理,当请求失败时显示错误信息。
5.2 练习:实现无限滚动
- 使用
useInfiniteQuery钩子实现无限滚动。 - 当用户滚动到页面底部时,自动加载更多文章。
6. 总结
React Query 是一个功能强大的库,简化了 React 应用程序中服务器状态的管理。通过本教程,你学习了如何安装和配置 React Query,以及如何使用 useQuery 和 useInfiniteQuery 钩子来获取和缓存数据。希望你能通过实践练习进一步掌握 React Query 的使用。
7. 下一步
- 深入学习 React Query 的高级功能,如乐观更新、依赖查询等。
- 探索其他状态管理库,如 Redux、MobX 和 Recoil。
- 学习如何使用 React Query 进行表单处理和数据验证。
希望这篇教程对你有所帮助,祝你在 React 开发中取得更多进步!